package br.com.consultoria.andre.biblos.server.web.controllers;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import br.com.consultoria.andre.biblos.server.services.LivroDao;
import br.com.consultoria.andre.biblos.server.web.model.Categoria;
import br.com.consultoria.andre.biblos.server.web.model.Livro;

@Component("livroBean")
@Scope("session")
public class LivroBean implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -4169520190354569671L;

	//private static final Logger logger = LoggerFactory.getLogger(LivroBean.class);

	private Livro livro;
	private Long id;
	private String titulo;
	private String autor;
	private Integer avaliacao;
	private String categoria;
	private String editora;
	private String isbn;
	private String tombo;
	private Integer paginas;
	private String disponivel;
	private Integer quantidade;
	private String localizacao;

	private List<Livro> livros;
	private List<Categoria> categorias;
	
	@Autowired
	private LivroDao livroDao;

	@PostConstruct
	public void init() {
		this.carregarCategorias();
	}
	
	public void carregarCategorias() {
		setCategorias(new ArrayList<Categoria>());
		setCategorias(livroDao.carregarCategorias());
		System.out.println(getCategorias().get(0).getCategoria());
	}

	public void listarLivroPorFiltro() {
		List<Livro> livrosFiltrados = new ArrayList<Livro>();
		livros = livroDao.list();
		
		for (int i = 0; i < livros.size(); i++) {
			if (livros.get(i).getId().equals(id)) {
				livrosFiltrados.add(livros.get(i));
				setLivros(livros);
			}
		}

	}
	
	public void salvarLivro(ActionEvent event) {
		livro = new Livro();
		livro.setId(id);
		livro.setTitulo(titulo.toUpperCase().trim());
		livro.setAutor(autor.toUpperCase().trim());
		livro.setAvaliacao(avaliacao);
		livro.setCategoria(categoria.toUpperCase().trim());
		livro.setDisponivel(disponivel.toUpperCase().trim());
		livro.setEditora(editora.toUpperCase().trim());
		livro.setIsbn(isbn);
		livro.setLocalizacao(localizacao.toUpperCase().trim());
		livro.setPaginas(paginas);
		livro.setQuantidade(quantidade);
		livro.setTombo(tombo.trim());

		if (null != livro) {
			livroDao.save(livro);
			limparCampos();
			this.enviarMsgPraTela("Sucesso:", "Livro salvo com sucesso! :)");
		} else {
			this.enviarMsgPraTela("Problema:", "Erro ao cadastrar o livro no banco de dados.");
		}

	}

	public void excluirLivro() {
		Boolean excluiu = false;
		
		excluiu = this.livroDao.excluirPorId(id);
		
		if (excluiu) {
			enviarMsgPraTela("Sucesso:", "Livro foi excluído! :)");
			setLivros(this.livroDao.list());
			this.limparCampos();
		} else {
			enviarMsgPraTela("Falha:", "Livro não foi excluído!");
		}
		
	}
	
	public void limparCampos() {
		id = null;
		titulo = null;
		autor = null;
		categoria = null;
		editora = null;
		isbn = null;
		localizacao = null;
		avaliacao = null;
		disponivel = null;
		paginas = null;
		quantidade = null;
		tombo = null;
	}
	
	public void enviarMsgPraTela(String summary, String detail) {
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, summary, detail);
		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	/**
	 * @return the livro
	 */
	public Livro getLivro() {
		return livro;
	}

	/**
	 * @param livro
	 *            the livro to set
	 */
	public void setLivro(Livro livro) {
		this.livro = livro;
	}

	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * @param id
	 *            the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * @return the titulo
	 */
	public String getTitulo() {
		return titulo;
	}

	/**
	 * @param titulo
	 *            the titulo to set
	 */
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}

	/**
	 * @return the autor
	 */
	public String getAutor() {
		return autor;
	}

	/**
	 * @param autor
	 *            the autor to set
	 */
	public void setAutor(String autor) {
		this.autor = autor;
	}

	/**
	 * @return the avaliacao
	 */
	public Integer getAvaliacao() {
		return avaliacao;
	}

	/**
	 * @param avaliacao
	 *            the avaliacao to set
	 */
	public void setAvaliacao(Integer avaliacao) {
		this.avaliacao = avaliacao;
	}

	/**
	 * @return the categoria
	 */
	public String getCategoria() {
		return categoria;
	}

	/**
	 * @param categoria
	 *            the categoria to set
	 */
	public void setCategoria(String categoria) {
		this.categoria = categoria;
	}

	/**
	 * @return the editora
	 */
	public String getEditora() {
		return editora;
	}

	/**
	 * @param editora
	 *            the editora to set
	 */
	public void setEditora(String editora) {
		this.editora = editora;
	}

	/**
	 * @return the isbn
	 */
	public String getIsbn() {
		return isbn;
	}

	/**
	 * @param isbn
	 *            the isbn to set
	 */
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}

	/**
	 * @return the tombo
	 */
	public String getTombo() {
		return tombo;
	}

	/**
	 * @param tombo
	 *            the tombo to set
	 */
	public void setTombo(String tombo) {
		this.tombo = tombo;
	}

	/**
	 * @return the paginas
	 */
	public Integer getPaginas() {
		return paginas;
	}

	/**
	 * @param paginas
	 *            the paginas to set
	 */
	public void setPaginas(Integer paginas) {
		this.paginas = paginas;
	}

	/**
	 * @return the disponivel
	 */
	public String getDisponivel() {
		return disponivel;
	}

	/**
	 * @param disponivel
	 *            the disponivel to set
	 */
	public void setDisponivel(String disponivel) {
		this.disponivel = disponivel;
	}

	/**
	 * @return the quantidade
	 */
	public Integer getQuantidade() {
		return quantidade;
	}

	/**
	 * @param quantidade
	 *            the quantidade to set
	 */
	public void setQuantidade(Integer quantidade) {
		this.quantidade = quantidade;
	}

	/**
	 * @return the localidade
	 */
	public String getLocalizacao() {
		return localizacao;
	}

	/**
	 * @param localidade
	 *            the localidade to set
	 */
	public void setLocalizacao(String localizacao) {
		this.localizacao = localizacao;
	}

	/**
	 * @return the livros
	 */
	public List<Livro> getLivros() {
		if (null == livros) {
			livros = new ArrayList<Livro>();
			setLivros(livroDao.list());
		}
		return livros;
	}

	/**
	 * @param livros
	 *            the livros to set
	 */
	public void setLivros(List<Livro> livros) {
		this.livros = livros;
	}

	/**
	 * @return the livroDao
	 */
	public LivroDao getLivroDao() {
		return livroDao;
	}

	/**
	 * @param livroDao
	 *            the livroDao to set
	 */
	public void setLivroDao(LivroDao livroDao) {
		this.livroDao = livroDao;
	}

	public List<Categoria> getCategorias() {
		return categorias;
	}

	public void setCategorias(List<Categoria> categorias) {
		this.categorias = categorias;
	}

	
}
